Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Prototype-based наследования vs. эмуляции Class-based наследования (Rumata)
Goto page 1, 2  Next
Author Message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sat Feb 09, 2008 1:09 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «Классическое наследование в JavaScript [обсуждение]»,
расположенной в форуме Разное :: JavaScript (Ср, 13 Февраля 2008, 15:27).
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sat Feb 09, 2008 1:09 pm (спустя 1 секунду; написано за 4 минуты 48 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Я искренне считаю, что чем больше проект, тем больше необходимость в класс-ориентированном подходе.
Т.е. "Красота" имеет смысл для проектирования, для командной работы над проектами типа GMail, Google Reader, Google Documents & SpreadSheets и т.д.
Вам реально не хватало классического ООП при написании больших проектов?
Хотя библиотеки типа Prototype используют аналогичный подход, я не вижу большой необходимости в искусственном приближении языка, ориентированного на объекты (или прототипы), к ОО-языку.

Гугл в данном случае несовсем к месту - там разработчики предлагают удобный и простой API, но там все построено на прототипах.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Feb 09, 2008 8:29 pm (спустя 7 часов 20 минут; написано за 13 секунд)
   Post subject:
Reply with quote

Rumata wrote:
я не вижу большой необходимости в искусственном приближении языка, ориентированного на объекты (или прототипы), к ОО-языку.
Так ведь все дело-то в том, что нужна "красота", которая "имеет смысл для проектирования, для командной работы над проектами".
На самом деле необходимость в этой самой пресловутой "красоте" появляется, как метко заметил Zeroglif, когда:
Quote:
кто-то не может отыскать в нём (в js) классов и т.п. или не видит связи со своей любимой книжкой про С++...
Back to top
View user's profile Send private message Send e-mail
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Sun Feb 10, 2008 4:36 am (спустя 8 часов 6 минут; написано за 21 минуту)
   Post subject:
Reply with quote

Rumata
Да. Я не смог развивать первую версию карты Москвы. Я не смог нормально передать исходники для другого городского портала (внедрение проходило очень болезненно)
Мне пришлось всё переделать. Сейчас любое развитие происходит безболезненно и в любую сторону. Например, на этой неделе я сделал фичу, при помощи которой посетители могут отметить себя на карте города. Разработка заняла 4 дня (включая 1.5 дня - обсуждение поставленной задачи, окончательное оформление и ковыряние в носу)

Я упомянул Гугл только для того, чтобы показать "порядок сложности задачи". Вот Вы бы смогли сделать такой же интерфейс, как у GMail, не используя идеологию классов ?

AKS
Не Zeroglif-ом единым жив JavaScript. К тому же фраза выдрана из контекста !

Rumata, AKS
Я вас вообще не понимаю. У нас происходит разговор глухого с немым =(
Мне кажется, что вы за деревом не видите леса! У вас есть табу "нельзя реализовывать классы на JS потому что это прототип-ориентированный язык" и всё... тупик и дальше к вам не пробиться =(

НО! Допустим, я не прав. Точнее допустим, что я что-то упустил, что это я глухой и немой одновременно и не могу понять элементарных вещей, которые видимо должны лежать на поверхности. Тогда, скорее всего должны быть уже готовые и реально работающие решения, куда меня можно ткнуть носом!
Вы не могли бы показать мне какой-нибудь очень динамический сайт, в котором всё сделано правильно и код был бы читаемым ?
(под "динамическим сайтом" я понимаю сайт без перезагрузки страницы для получения новых данных, а не эффекты script.aculo.us)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Feb 10, 2008 9:07 am (спустя 4 часа 30 минут; написано за 3 минуты 27 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Не Zeroglif-ом единым жив JavaScript.
Ну тогда поделитесь со мной ссылочками на полезное чтиво по JavaScript на Zeroglif'овском уровне.
Andrey Mindubaev wrote:
К тому же фраза выдрана из контекста !
А по мне - так нет! По-моему, очень даже гармонично я ее вписал, т.к. тот контекст имеет связь с данным (может быть и неявную). Судя по вашей реакции - так оно и есть.
Andrey Mindubaev wrote:
У вас есть табу "нельзя реализовывать классы на JS потому что это прототип-ориентированный язык" и всё... тупик и дальше к вам не пробиться =(
Да почему же "табу"? Мне понравилось ваше решение. Другое дело, что не всем может быть понятно почему Вы не можете без этого обойтись. Я высказал свое предположение, цитируя Zeroglif'а и все. Кто-то другой может вообще написать, что Вы недостаточно хорошо знакомы с js и не имеете достаточного опыта работы в этой области, в частности, в области проектирования js-систем (заметьте, что у меня не эта, а более дружественная версия ;) ).
Andrey Mindubaev wrote:
Вы не могли бы показать мне какой-нибудь очень динамический сайт, в котором всё сделано правильно и код был бы читаемым ?
Вы что, бравируете своим произведением, ссылку на которое давали выше? В таком случае у Вас, как минимум, с "правильностью" не все в порядке, т.к. window.onunload (developer.mozilla.org/en/docs/DOM:window.onunload) - это:
Quote:
DOM Level 0. Not part of any standard.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sun Feb 10, 2008 10:25 am (спустя 1 час 18 минут; написано за 7 минут)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Вот Вы бы смогли сделать такой же интерфейс, как у GMail
Нет - из меня плохой дизайнер.

И что Вы гуглу прицепились - он совсем Вам не помощник в Вашей же аргументации.
Я еще раз повторю - клиентский гугл АПИ реализован на "чистом" js.
Там нет и намека на реализацию классического ООП, все построено исключительно на прототипах.
Andrey Mindubaev wrote:
вы за деревом не видите леса! У вас есть табу
Не говорите за других. Если есть нечто, которое облегчает решение задачи, его стоит использовать.
Тем не менее не ясно, чем же Ваше решение лучше других "сахарных"?
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Mon Feb 11, 2008 1:38 am (спустя 15 часов 12 минут; написано за 1 минуту 29 секунд)
   Post subject:
Reply with quote

AKS
Знаю только одну ссылку www.ecmascript.org/ (см. раздел "Interested in ECMAScript Edition 4?"). Классам в JS быть (правда непонятно когда)
А вообще, я не хочу с ним ссылками меряться =)

> как минимум, с "правильностью" не все в порядке, т.к. window.onunload ...
Именно по этому я и не "бравирую" своим "как бы фреймвёрком" (там не всё гладко). Сейчас это работает и это главное.

Мне приятно то, что Вам понравилось моё решение. Но мне всё таки очень хочется посмотреть решения людей, которых Вы считаете более опытными в области проектирования js-систем. Вы не могли бы дать ссылку (ссылки) ?

Rumata
Да я понимаю прекрасно, как гугла всё реализовано - у них серверная и клиентская часть очень сильно взаимосвязаны (я всегда считал, что у них на сервере что-то по типу code.google.com/webtoolkit/ (я могу ошибаться)). Я просто не могу привести другой пример (я хотел привести в пример объем задачи, а не конкретную реализацию)
Quote:
Тем не менее не ясно, чем же Ваше решение лучше других "сахарных"?
Я считаю, что мой вариант синтаксиса понятнее, чем все остальные:

Я нашёл 2 решения: в prototype.js (prototypejs.org/learn/class-inheritance) и в base2.js (dean.edwards.name/weblog/2006/03/base/)jQuery (www.danwebb.net/2008/1/31/low-pro-for-jquery) вызов функций родительского класса выглядит так же как и в prototype.js)
  1. prototype.js: $super() - первый параметр функции должен иметь название $super; вызов этой функции работает очень медленно.
  2. base2.js: this.base() - решение схожее; работает очень быстро; так же как и в prototype.js нельзя вызвать другую функцию родительского класса (с другим именем)
  3. Дмитрий Котеров: this.constructor.prototype.drive.call(this); - универсальный способ; это не возможно использовать в промышленных масштабах
Мой вариант: this.drive.__parent()

AKS, Rumata
Quote:
У вас есть табу "нельзя реализовывать классы на JS потому что это прототип-ориентированный язык" и всё... тупик и дальше к вам не пробиться
Если я вас чем-то обидел, я прошу прощения. Было уже очень поздно, а неподтверждённое примерами мнение о "ненужности" классов в JS меня немного разозлило =(
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Feb 11, 2008 8:45 am (спустя 7 часов 6 минут; написано за 27 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Знаю только одну ссылку
Я ее тоже знаю. ;)
Andrey Mindubaev wrote:
Классам в JS быть (правда непонятно когда)
Смотря что такое JS, например в JScript.NET они уже есть.
Andrey Mindubaev wrote:
Сейчас это работает и это главное.
Работает не так, как надо. Вчера посмотрел, как отображается ваша карта в разных браузерах. Так вот в разных браузерах она отображается соответственно по-разному, и не всегда корректно. Причем в некоторых, к примеру в IE 5.0, вообще скрипт вызывает сообщения об ошибках. Чтобы действительно "это работало", нужно хотя бы избавиться от ошибок.
Andrey Mindubaev wrote:
Но мне всё таки очень хочется посмотреть решения людей, которых Вы считаете более опытными в области проектирования js-систем.
А я не писал, что кого-то считаю опытным, а кого-то неопытным - это раз. А два - у меня нет достаточно времени искать чьи-нибудь готовые решения и разбираться с ними (хороши они или плохи). Даже когда кто-нибудь указывает конкретно, что ...Google Maps не отжирал бы по 700 мегов оперативы за 3-4 часа работы... (xpoint.ru/forums/programming/javascript/misc/thread/41645.xhtml#367176), я уже не бросаюсь разглядывать их исходники (пройденный этап). Если уж разработчикам некогда заниматься своим бизнесом, мне это тем более не нужно.
Andrey Mindubaev wrote:
Я нашёл 2 решения: в prototype.js и в base2.js
Не стоит равняться на prototype.js/base2.js...
Back to top
View user's profile Send private message Send e-mail
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Mon Feb 11, 2008 11:39 am (спустя 2 часа 54 минуты; написано за 19 минут 58 секунд)
   Post subject:
Reply with quote

AKS
Quote:
Смотря что такое JS
Ну я говорю исключительно про JS, который в браузерах работает (в IE, FF, ИТД ну вы в курсе =)
Quote:
к примеру в IE 5.0, вообще скрипт вызывает сообщения об ошибках
Я посчитал, что IE5 умер, убрал всякие расширерия по типу Function.prototype.apply = function() { ... } и теперь ориентируюсть на более новые браузеры: IE6, IE7, FF2, Opera9, Safari3
А вот в какой степени я не прав - хз (статистика li.ru говорит, что в рунете IE5 - это 0.8%)
Поставлю сегодня в VMWare более старые версии FF и Opera, прверю всё ли выглядит так как надо.
Quote:
Не стоит равняться на prototype.js/base2.js...
Такого монстра, как прототайп я никогда не сделаю, да и нет такой задачи.
НО: могу взять функцию определения размера HTML-элемента; могу подсмотреть как реализован Template, могу взять RegExp-ы для разбора CSS правил в Selector и реализовать то, что нужно мне.
Dean Edwards - так вообще маньяк какой-то, с ним тягаться нереально.
Эти библиотеки, в основном, - источники идей и знаний.
"Ровняться", для меня, - это изучить реализацию идеи, если нравится - взять, если не нравится - сделать своё, а потом сравнить как оно работает + в крайнем случае обсудить свою реализациею с другими (чем я, собственно сейчас и занимаюсь =)
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Tue Feb 12, 2008 6:38 pm (спустя 1 день 6 часов 58 минут; написано за 2 минуты 13 секунд)
   Post subject:
Reply with quote

maps.yandex.ru/moscow

Сделано Голубевым Фёдором.
Все в рамках js без оберток в оправдание своей некомпетентности в проектировании.

Лично я делал несколько проектов для яндекса, тоже без потыток исковеркать prototype based наследование.
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Tue Feb 12, 2008 7:47 pm (спустя 1 час 8 минут; написано за 7 минут 5 секунд)
   Post subject:
Reply with quote

Андрей Сумин
О! Конкурирующая фирма =) Враги, блин, купили СмиЛинк и перекрыли нам доступ к пробкам... Ну да ладно - что было, то было =)
Quote:
Все в рамках js... тоже без потыток
У меня такое ощущение, что тут все знают про рамки js, но никто не говорит (а может быть кто-то просто слышит звон, да не знает где он ?)
Quote:
без оберток в оправдание своей некомпетентности в проектировании
Раз уж пошла такая пьянка, я сёдня програмулю напишу, который ваши скрипты лесенкой переформатирует (а то нечитаемо как-то)
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Feb 12, 2008 8:43 pm (спустя 56 минут; написано за 2 минуты 17 секунд)
   Post subject:
Reply with quote

Вот интересно, почему никто не использует простейший вариант:
Code (JavaScript): скопировать код в буфер обмена
function extend (clazz,obj) {
    var o = ['var parent = arguments.callee.parent;'];
    for (var i in obj) {
         o.push('this.'+i+' = '+obj[i]);
    }
    var q = new Function ('',o.join(';'));
    q.prototype = new clazz;
    q.parent = q.prototype;
    return q;
}

var a = extend (function(){},{
    run : function () {
        alert('a::run');
    }
})
var b = extend (a,{
    run : function () {
        alert('b::run');
        parent.run();
    }
})
var c = extend (b,{
    run : function () {
        alert('c::run');
        parent.run();
    }
})
var d = extend (b,{
})

alert('running C');
var C = new c;
C.run();

alert('running D');
var D = new d;
D.run();
И наследование полностью естественное (прототипированное), и перегруженные методы вызываются преспокойно...
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Tue Feb 12, 2008 11:07 pm (спустя 2 часа 23 минуты; написано за 4 минуты 24 секунды)
   Post subject:
Reply with quote

WingedFox
Потому что это, как минимум, не работает...
Code (JavaScript): скопировать код в буфер обмена
var a = extend (function(){},{
    run : function () {
       alert(this.var1); // -> undefined
    }
});
var b = extend (a,{
    run : function () {
        this.var1 = 1;
        parent.run();
    }
});
Кстати, если конструкции вида "q.prototype = new clazz;" - это "наследование полностью естественное", то у меня тоже прототипное наследование =) Я просто это называю классическим - и сущности a, b, c, d - это самые настоящие классы.

ЗЫЖ Пользуясь случаем выкладываю самую последнюю версию (больше выкладывать не буду, а то иначе получится, что моё решение вовсе не готовое =( Там попроще получилось - с этой оптимизацией я сам себя запутал =)


Inherit.v4.zip
 Description:
Inherit.js

Download
 Filename:  Inherit.v4.zip
 Filesize:  3.51 KB
 Downloaded:  601 Time(s)

Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Feb 12, 2008 11:30 pm (спустя 23 минуты; написано за 1 минуту 37 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev
Ну, звиняйте, до конца всё разжёвывать не буду. Это просто направление для размышления и не более того.
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Wed Feb 13, 2008 12:31 am (спустя 1 час 1 минуту; написано за 5 минут 49 секунд)
   Post subject:
Reply with quote

Я уже год не работаю в Яндексе, так что не конкуренты.

Кстати, а Вы не думали почему популярные либы делают псевдо class based наследование? Так вот они это делают для Java разработчиков которые знают только class based наследование, чтобы они хоть как-то могли писать на JS. Я сам разговаривал с разработчиком dojo и в dojo и во всех остальных либах нет наследования которое работает "как в книжке". Ксати если вы прочитали не только наблу но и тему форума про это наблу, то должны были знать что она не работает после 3 или 4 наследования и ниже, помоему даже сам Дмитрий это написал.

Мое мнение такое: единственный способ сделать полноценное class based наследование на JS это написать интерпритарор другого языка на нем.
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Feb 13, 2008 2:17 am (спустя 1 час 45 минут; написано за 10 минут 37 секунд)
   Post subject:
Reply with quote

Честно выскажусь по данной теме.
Я до сих пор придерживаюсь мнения что, если кому-то что-то надо то это может пригодиться другому.
Но! Только в том случае, если это оправдано!
В настоящее время я вижу, что разработан некая библиотека, которая решает задачи, которые решены другими в более полной мере.
К сожалению, автор темы так и не смог дать точного ответа, чем же его библиотека лучше существующих аналогов.
Поэтому я считаю любую дискуссию "оффтопичной" (простите за кривизну речи) и все обсуждения предлагаю перенести в мусорку.

М

судя по всему я остаюсь модератором данного раздела,
несмотря на многочисленные мои заявления,
поэтому до сих пор имею право решающего голоса в обсуждениях.
По сему - не обесудьте.
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Feb 13, 2008 4:23 pm (спустя 14 часов 6 минут; написано за 2 минуты 59 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev
отвечу на Ваш вопрос.

Я не против Вашего кода.
Я скорее против самого принципа эмуляции того, что можно реализовать средствами самого языка без "подслащивания".
Возможно, что прототипирование не самый лучший вариант, но язык реализован так и не иначе, и нам остается только пользоваться.
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Thu Feb 14, 2008 2:40 am (спустя 10 часов 16 минут; написано за 7 секунд)
   Post subject:
Reply with quote

Андрей Сумин
Quote:
Кстати, а Вы не думали почему популярные либы делают псевдо class based наследование?
Я даже не задумывался над этим... Воспринимал это как само собой разумеющееся и задавал себе вопрос "так почему же этим не пользуются ?" =))
Quote:
Так вот они это делают для Java разработчиков которые знают только class based наследование
Но это же хорошо, когда получается создать продукт сразу для нескольких секторов рынка + реализации псевдо классов - это в какой-то степени само-документация к фреймвёрку или даже к самому языку.
Quote:
и в dojo и во всех остальных либах нет наследования которое работает "как в книжке".
А ведь и не получится никогда "как в книжке" (но может получится "почти как в PHP4" =)
Quote:
Ксати если вы прочитали не только наблу но и тему форума про это наблу, то должны были знать что она не работает после 3 или 4 наследования
Я эту тему читал очень давно. Пришёл туда не со страницы наблы и читал только коменты про прототипы и конструкторы, а перед написанием первого сообщения не стал её перечитывать =(
Quote:
Мое мнение такое: единственный способ сделать полноценное class based наследование на JS это написать интерпритарор другого языка на нем.
Я считаю, что думать в стиле "class-based" - это правильно. Лично мне достаточно удобной формы описания сущностей и их наследования.
Quote:
Цитата:
Язык, как средство выражения мыслей, и мышление, как процесс производства мыслей, теснейшим образом взаимосвязаны и взаимообусловлены. Взаимозависимость языка и мышления проявляется, упрощенно говоря, в том, что мысли отливаются в формы, удобные для их выражения средствами языка, а язык устроен таким образом, чтобы наиболее адекватно отражать сформировавшиеся мысли.
(c) www.topos.ru/article/4080
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Thu Feb 14, 2008 2:41 am (спустя 37 секунд; написано за 48 секунд)
   Post subject:
Reply with quote

Rumata
Quote:
Я скорее против самого принципа эмуляции того, что можно реализовать средствами самого языка
JavaScript, как язык, мне очень нравится. В процессе работы мне приходится писать как клиентскую, так и серверную часть и переключаться с JS на PHP иногда очень тяжело. Не хватает в основном Func.call(this, ...) и замыканий. JS даёт массу возможностей, самая главная из которых - это возможность подстроить язык под себя, придумывать удобные конструкции, которыми можно пользоваться !
Quote:
Возможно, что прототипирование не самый лучший вариант, но язык реализован так и не иначе, и нам остается только пользоваться.
Прототипирование - это наоборот очень здорово ! Добавляем свойство в прототип функции-конструктора и оно становится доступным во всех объектах, построенных на её основе! Нам не "остаётся пользоваться", а нам просто необходимо этим пользоватся =)

С другой стороны, конечно, пользоваться этим очень неудобно =) Чего только стоит конструкция вида:
Code (JavaScript): скопировать код в буфер обмена
Func2.prototype = new Func1();
Func2.prototype.Method_1 = function() { /*  ... */ };
/*  ... */
Func2.prototype.Method_N = function() { /*  ... */ };
// Вопрос 1 (полуриторический): Это возможности языка в чистом виде или зачатки класс-ориентированного подхода ?
 
Если повторить эти строчки несколько десятков раз, то можно запросто отбить у себя желание писать на JS. Можно, конечно, написать себе в помощь функцию:
Code (JavaScript): скопировать код в буфер обмена
Function.prototype.Extend = function(Func, Methods) {
  Func.prototype = new this();
  Func.prototype.constructor = Func;
  for (var i in Methods)
    Func.prototype[i] = Methods[i];
}
//
 
Далее у нас обязательно возникнут следующие желания:
  1. Передавать какие-то параметры в "новую функцию-конструктор" (от предыдущей функции сразу же придётся отказаться =)
  2. Выполнять какой-то дополнительный код этой функции-конструкторе (тут, правда, начинается класс-ориентированное непонимание: конструктор в JS - это процесс создания объекта, а не код, который выполняется сразу же после его создания. На свет рождается функция initialize в prototype.js)
  3. Избавиться от внутреннего конфликта "Как же это так? И прототип Func2 создаётся через new Func1() и новый объект тоже создаётся через new Func1()"
  4. Иметь возможность повторно использовать написанный код (фактически это вызов перекрытой функции какого-то конструктора-предка, да ещё и в контексте thisObj)
  5. ... и понеслось =)
Вопрос 3: В какой момент я должен был остановиться, чтобы не иметь с Вами конфликтов на религиозной почве ? =)
Вопрос 4: А может быть извраты с прототипами были с самого начала (с Func2.prototype = new Func1();) ?
Вопрос 4.1: Если Вы ответите положительно на вопрос 4, то что же такое Prototype-based наследование/программирование ?
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Feb 14, 2008 12:08 pm (спустя 9 часов 26 минут; написано за 34 секунды)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
что же такое Prototype-based наследование/программирование ?
Javascript - язык, где наследование реализовано через делегирование, это то же наследование, только вид сбоку - автоматическая переадресация сообщений к предку с одновременным связыванием self ("this" в javascript) с получателем сообщения. Механизм назван создателями языка именно наследованием, закреплён в стандарте. Иными словами, тупо обращаясь к энному свойству, мы уже по уши в наследовании и прототипах, т.к. механизм делегирования взведён изначально, да и вообще, что бы мы ни делали - оно всегда prototype-based...

Что касается конкретно prototype-based программирования - то это такая непереводимая игра слов в защиту javascript, направленная на борьбу со злобными аспидами, то бишь теми, кто:

а) упорно и не в кассу пользуется class-based терминологией;
б) пытается безграмотно калькировать class-based-чего-то-там на бедный несчастный javascript;

;-)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Feb 14, 2008 12:40 pm (спустя 32 минуты; написано за 3 минуты)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
JS даёт массу возможностей, самая главная из которых - это возможность подстроить язык под себя, придумывать удобные конструкции, которыми можно пользоваться !
Для этого он и придуман:
Quote:
ECMAScript Language Specification (4 Overview):
A scripting language is a programming language that is used to manipulate, customise, and automate the facilities of an existing system. In such systems, useful functionality is already available through a user interface, and the scripting language is a mechanism for exposing that functionality to program control. In this way, the existing system is said to provide a host environment of objects and facilities, which completes the capabilities of the scripting language.
Andrey Mindubaev wrote:
С другой стороны, конечно, пользоваться этим очень неудобно =) Чего только стоит конструкция вида:
Есть и другие способы.
Andrey Mindubaev wrote:
Далее у нас обязательно возникнут следующие желания:
А то как же? Чем дальше в лес – тем больше дров. :)
Andrey Mindubaev wrote:
Избавиться от внутреннего конфликта "Как же это так? И прототип Func2 создаётся через new Func1() и новый объект тоже создаётся через new Func1()"
Избавляться надо от причин, породивших такой конфликт.
Andrey Mindubaev wrote:
В какой момент я должен был остановиться, чтобы не иметь с Вами конфликтов на религиозной почве ? =)
Думаю, что надо не останавливаться, а всего лишь задуматься. Задуматься о том, что инструмент, который Вы сделали для себя, наверняка не стоит характеризовать, как более понятный, более быстрый и т.д.
Andrey Mindubaev wrote:
А может быть извраты с прототипами были с самого начала (с Func2.prototype = new Func1();) ?
Такая ментальность как раз рукам покоя не дает (я о том, чтобы называть что-то "извратами"). Результат – пятые колеса, изобретать которые берется то один, то другой, считая, что это поможет обойтись без "извратов".
Back to top
View user's profile Send private message Send e-mail
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Thu Feb 14, 2008 2:38 pm (спустя 1 час 57 минут; написано за 13 минут 9 секунд)
   Post subject:
Reply with quote

Zeroglif
О! Тяжёлая артилерия =)
Quote:
Javascript - язык, где наследование реализовано через делегирование...
Это я уже давно понял (начитавшись Ваших же коментов здесь, на хабре и на винград.ру). Это очень здорово и открывает массу возможностей =)
Quote:
prototype-based программирования - то это такая непереводимая игра слов в защиту javascript, направленная на борьбу со злобными аспидами, типа Andrey Mindubaev
Во! Это, кстати, тема (имхо, это камень в огород вашего стана нелюбителей классов). Я её попозже разовью =)
Quote:
...пытается безграмотно
Скажите, пожалуйста, что такое "грамотно" в Вашем понимании

AKS
Quote:
Andrey Mindubaev wrote:
С другой стороны, конечно, пользоваться этим очень неудобно =) Чего только стоит конструкция вида:
Есть и другие способы.
Во! А приведите, хотябы два примера, пожалуйста (как я понял способов гораздо больше)

Zeroglif, AKS, Rumata, Андрей Сумин
Я предлагаю устроить какое-нибудь показательное выступление с участием заинтересованных сторон =)
Например, можно сделать какой-нибудь показательный пример, максимально характеризующий наши подходы (а то мне приходится плоскогубцами выдирать подтверждения аргументов =)

ЗЫЖ Я действительно хочу понять где я не прав, либо доказать свою правоту =)

Last edited by Andrey Mindubaev on Thu Feb 14, 2008 4:00 pm; edited 1 time in total
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Feb 14, 2008 3:18 pm (спустя 39 минут; написано за 7 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
...камень в огород вашего стана нелюбителей классов
А где в js классы? Те, что написаны Вами? А за что их любить? Я уже неоднократно пытался обратить ваше внимание на то, что этот самобытный инструмент может пригодиться Вам, но не надейтесь, что он будет понятен и полезен кому-то еще.
Andrey Mindubaev wrote:
...показательное выступление с участием заинтересованных сторон
Так ведь есть лишь одна заинтересованная сторона - это Вы. Остальным все равно - будете ли Вы использовать свой "sugar", или научитесь излагать свои мысли, используя привычный для js синтаксис.
Andrey Mindubaev wrote:
Я действительно хочу понять где я не прав, либо доказать свою правоту
Вы неправы в том, что хотите доказать свою правоту. В чем ваша правда?
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Feb 14, 2008 3:27 pm (спустя 8 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Скажите, пожалуйста, что такое "грамотно" в Вашем понимании
!безграмотно

Ну, предположим, что кому-то удобнее вовлекать js-код в форму "взаимодействующих-классов-подклассов-и-прочих-лжесущностей", при этом у него потерь в оптимизации нет, грубых ошибок нет, каждая строчка обоснована, всё читабельно, задача выполняется. Имеем эдакий качественный prototype-based, зачем-то закамуфлированный барином под class-based. Это и будет грамотный class-based подход. Правда, никогда такого не видел. ;-)
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Thu Feb 14, 2008 4:21 pm (спустя 54 минуты; написано за 55 секунд)
   Post subject:
Reply with quote

Quote:
Во! А приведите, хотябы два примера, пожалуйста (как я понял способов гораздо больше)
\
Code (any language): скопировать код в буфер обмена
MyFunc () {}
MyFunc.prototype= {
Method1 : function () {},
Method2 : function () {}
};
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Thu Feb 14, 2008 5:38 pm (спустя 1 час 17 минут; написано за 4 секунды)
   Post subject:
Reply with quote

На самом деле, в чистом прототипировании невозможно красиво сделать одну единственную вещь: вызов перегруженного метода.
Так что, всяческим "class-based" фреймворкам место есть. Другое дело, что наворачивать туда всякий мусор совсем не стоит.
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Fri Feb 15, 2008 1:43 am (спустя 8 часов 5 минут; написано за 3 минуты 52 секунды)
   Post subject:
Reply with quote

AKS
Своей темой я в том числе хотел проверить, а в том ли направлении я иду. Очень жаль, что Вам всё равно.

dimagolov
Спасибо за пример (только это же существенно не отличается от самого первого кода в моём ответе Rumata)
В любом случае это не поможет при решении некоторых задач. Приведу пример:

Есть два объекта. Например два Object, у которых одно из свойств - это указатель на кнопку (на input type="button").
Первый объект по клику обрабатывает свои свойства и результат обработки отправляет на сервер, после получения ответа сервера выводит какую-то инфомацию.
Второй объект по клику обрабатывает свои свойства, выводит форму для корректировки пользователем и по нажатию на submit отправляет на сервер.
Тут я бы выделил общее у двух этих объектов, описал бы абстрактную сущность, затем описал бы две реализации этой абстрактной сущности (по одной на каждый объект)
Если делать по другому (т.е. не описывая сущности, то при добавлении в систему объекта с другим поведением могут возникнуть проблемы)

WingedFox
Quote:
в чистом прототипировании невозможно красиво сделать одну единственную вещь: вызов перегруженного метода.
Вы, наверное, имели ввиду не "невозможно", а "сложно" ? (ведь информацию о перекрытых методах можно выяснить через prototype chain)
И почему отсутствие облегчающих конструкций (какого-нибудь Sugar) вы называете "чистым прототипированием", а присутствие этих конструкций вдруг оказывается "недо-прототипированием" ? (получается какая-то дискриминация по рассовому признаку =)
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 5:38 am (спустя 3 часа 54 минуты; написано за 2 минуты 12 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Есть два объекта.
одна из реализаций, которая мне увиделась при прочтении этого примера - использование callback-вызова
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Feb 15, 2008 7:48 am (спустя 2 часа 10 минут)
   Post subject:
Reply with quote

Andrey Mindubaev
WingedFox wrote:
невозможно красиво
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 10:23 am (спустя 2 часа 34 минуты; написано за 5 минут 38 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Очень жаль, что Вам всё равно.
Мне "все равно" настолько, чтобы не участвовать в предлагаемых вами "показательных выступлениях". Я готов проявить интерес (я ведь это показал) к разработке чего бы там ни было, но как я должен сделать "то, не знаю что"?
Хорошо, Вы привели конкретный пример с обработчиками форм. Я, как и Rumata, готов написать код, обрабатывающий формы, используя лишь функциональные возможности языка. Это будет просто и эффективно. Вы, со своей стороны, фантазируете об абстрактных сущностях и мечтаете все сделать красиво. И как тут разобраться, что лучше, а что хуже, если у одного красиво, а у другого совсем иная песня? Согласитесь, что такие "выступления" будут напрасной тратой времени.
Я, кстати, тоже "болел" красотой, только у меня она ассоциировалась с лаконичностью. Я думал, что если я краток – то это похвально. В результате появлялись какие-то странные однострочные, через запятую, выражения и много другого разного трэша. Но меня тут быстро "вылечили" – теперь здоров и радуюсь жизни.
Возвращаясь к теме - если уж делать попытки разобраться, как написать сlass-based наследование на js (что, в принципе, по определению нонсенс), то необходимо иметь соответствующую задачу. И это должна быть задача не с обработкой форм, где ваши два объекта можно заменить функцией с несколькими условиями, а задача, которую не решить без OOП. Причем пытаться решать надо в том ключе, который указал Zeroglif:
Quote:
потерь в оптимизации нет, грубых ошибок нет, каждая строчка обоснована, всё читабельно, задача выполняется
И это правильно. Вы ведь, задясь за работу, не думаете о том, как все сделать плохо, с ошибками и т.д. Ведь все наоброт.
Как там звучит, понравившееся Вам из Википедии (ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0):
Quote:
«Не следует множить сущее без необходимости» (либо «Не следует привлекать новые сущности без самой крайней на то необходимости»).
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 11:45 am (спустя 1 час 21 минуту; написано за 23 секунды)
   Post subject:
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
Function.prototype.extend= function( obj ){
        for( var i in obj ) this.prototype[ i ]= obj[ i ];
        return this;
}
Function.prototype.create= function( ){
        var obj= new this( );
        this.apply( obj, arguments );
        return obj;
}

var a= function( a ){
        this.a= a;
}.extend({
        b: 666
}).create( 333 )

var b= function( c ){
        this.c= c;
        a.constructor.call( this, c );
}.extend( a ).extend({
        d: 'xyz'
}).create( 777 )

var c= b.constructor.create( 999 );
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 12:31 pm (спустя 45 минут; написано за 13 секунд)
   Post subject:
Reply with quote

и немного подсластим...
Code (JavaScript): скопировать код в буфер обмена
Object.extend({
        callMethod: function( name, args ){
                return this[ name ].apply( this, args );
        }
,
        birth: function( ){
                return this.constructor.callMethod( 'create', arguments );
        }
})

var d= c.birth( 123 );
Back to top
An6rey
Участник форума



Joined: 30 Aug 2007
Posts: 69
Карма: 3
   поощрить/наказать


PostPosted: Fri Feb 15, 2008 11:14 pm (спустя 10 часов 43 минуты; написано за 15 минут 30 секунд)
   Post subject:
Reply with quote

Недавно прочитал код наследование из YUI и решил воспроизвести его здесь. Идея примерно как в шкльном примере C:=A; A:=B; B:=C;
Code (JavaScript): скопировать код в буфер обмена
extend: function(subc, superc, overrides) {
...
        var F = function() {};
        F.prototype=superc.prototype;
        subc.prototype=new F();
        subc.prototype.constructor=subc;
        subc.superclass=superc.prototype;
        if (superc.prototype.constructor == Object.prototype.constructor) {
            superc.prototype.constructor=superc;
        }
 ...
    },
По поводу не красивой но более удобной реализации доступа к родительским методам такая идея (уже на из YUI)

Лишних замыканий можно избежать если отказаться от вызова в стиле parent.method0();
Можно следовать соглашению PHP и привязать метод к прототипу как prototype.parent_method0 = parent.methid0.

Ну и наконец зачем все это городить?

Основная причина, по которой я использую user classing - не связана даже с ООП и наследовнием.
Я столкнулся с тем, что код JavaScript разрастаясь в объеме становится сложнее в отладке.
И сильно нуждался в модульности. Использовать модули значит содержать большой список подключения.
Зависимость между модулями усложняется и загружать их нужно в определенном порядке.

Организация классов и наследования, совмещенная с загрузкой - решает все проблемы - и с модульностью и с загрузкой кода.
Я присоединяю только один модуль util.js - и далее толко создаю классы create("dir0.dir1.Class0")
или же просто загружаю модуль require("dir0.dir1.module0") и разрабатываю с удовольствием.
Back to top
View user's profile Send private message
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Mon Feb 18, 2008 2:15 am (спустя 2 дня 3 часа 48 секунд; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Rumata, AKS
Я тут многа думал о том почему же мы друг друга не понимаем =) И пример у меня какой-то неправильный получился - его действительно можно решать и "по нормальному" =) Я его переформулирую:
Quote:
В некой системе есть набор объектов. Каждый объект по сигналу может отправлять какому-либо получателю свои данные.
Мы знаем, что в момент запуска в системе должно быть только 2 типа объекта (те, которые я описал в предыдущий раз).
Так же мы знаем, что через некоторое время поступит задача разработать другие типы объектов. Количество новых типов объектов ничем не ограничено.
Кстати, показательные выступления скорее всего действительно не получатся... По сути результатом должно было бы стать "кто быстрее остальных не сможет дальше решать задачу, не переделывая весь код, тот и проиграл" - а это долго, а значит не реально.

Гость, если честно я не врубился в Ваш пример =( По крайней мере в нём не реализован вызов функций родительских "классов".

An6rey
Quote:
Можно следовать соглашению PHP и привязать метод к прототипу как prototype.parent_method0 = parent.method0.
Таким образом мы решим проблему с method0, но на следующем шаге у нас появится такая же проблема с parent_method0.

Андрей Сумин
Quote:
maps.yandex.ru/moscow
Все в рамках js без оберток в оправдание своей некомпетентности в проектировании.
Кстати, мы ещё посмотрим какая из карт продержится без переделывания =)
(правда это при условии, что обе карты будет добавляться новый функционал)

Всем
Изучая код карты яндекса я сформулировал (по крайней мере для себя) случаи, в которых стоит использовать class-based подход.

В любом случае, мы должны как-то описывать сущности, с которыми мы работаем.
Если для решения задачи не требуется описывать сущности, то задача приравнивается к "Hello, World!" и может быть решена при помощи любого из популярных фреймвёрков.
Тоже самое относится и к задачам по типу страницы script.aculo.us/ (там описывается только поведение HTML-элементов).
Если в спроектированной системе получаются очень разнородные сущности (например, Календарь, Ссылка и Форма), то классы не нужны.
Задумываться о подходе стоит в тот момент, когда одни сущности описываются через другие и описание новых сущностей происходит через расширение/объединение старых.

Имхо, вот два случая, когда сущности нужно называть классами (и не обманываться на счёт prototype-based подхода):
  1. При расширении сущности и её потомков добавляется большое количество функционала, который должен обрабатывать большое количество данных.
  2. Некоторые сущности и её потомки могут расширяютмя очень много раз (пусть даже небольшими порциями)
=)

ЗЫЖ Вот, например, часть дерева сущностей из карты яндекса:
Quote:
HtmlComponent
. ImageForLayer
IGroup
. ObjectsGroup
. . ConnectedPoints
. . . RulerContainer
. . Group
. . YMapsML
. LayerWithObjects
. . CommonLayerWithObjects
. . LayerMap
Казалось бы, что может быть общего между "Слоем картинок карты" и "Контейнером точек для замера расстояния" ? =) В яндексе решили, что и то, и другое - "Группы Объектов".

ЗЫЗЫЖ AKS, мне очень нравится принцип "Бритва Оккама" =) К тому, что написано в вики:
Quote:
Порой принцип выражается в словах "То, что можно объяснить посредством меньшего, не следует выражать посредством большего"
я могу добавить, что "Если большую сущность можно выразить посредством меньшей сущности, то это необходимо сделать" (это критерий "необходимости привлечения новых сущностей")
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Feb 18, 2008 8:41 am (спустя 6 часов 26 минут; написано за 55 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
По сути результатом должно было бы стать "кто быстрее остальных не сможет дальше решать задачу, не переделывая весь код, тот и проиграл" - а это долго, а значит не реально.
Почему же долго и нереально? Вы уже несколько раз переделали код прямо здесь. :)
Back to top
View user's profile Send private message Send e-mail
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Mon Feb 18, 2008 12:07 pm (спустя 3 часа 25 минут; написано за 3 минуты 55 секунд)
   Post subject:
Reply with quote

AKS, =)
Да ладно Вам придираться то =) Я же не менял "весь код" своего проекта. К тому же те полтора килобайта менялись до того, как я написал эту фразу - поэтому не считается =)
Back to top
View user's profile Send private message
gregof.ya.ru
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Feb 18, 2008 12:42 pm (спустя 34 минуты; написано за 46 секунд)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Казалось бы, что может быть общего между "Слоем картинок карты" и "Контейнером точек для замера расстояния" ? =) В яндексе решили, что и то, и другое - "Группы Объектов".
По вашему у них нет ничего общего?
Если да, то на каких основаниях вы делаете подобный вывод?
Back to top
Andrey Mindubaev
Участник форума



Joined: 27 Jun 2007
Posts: 34
Карма: 2
   поощрить/наказать

Location: Горький-Московский

PostPosted: Mon Feb 18, 2008 12:48 pm (спустя 5 минут; написано за 4 минуты 16 секунд)
   Post subject:
Reply with quote

gregof.ya.ru
Я не имел ввиду ничего плохого, не хотел сказать, что спроектировано не правильно. Если вам так показалось, то прошу прощения (что-то я действительно написал как будто критикую)

Update
Кстати, Фёдор, приветствую Вас =) Рад, что вы присоединились к дискусии (ну или хотябы что ей заинтересовались)

Last edited by Andrey Mindubaev on Mon Feb 18, 2008 1:00 pm; edited 1 time in total
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Feb 18, 2008 12:59 pm (спустя 11 минут; написано за 53 секунды)
   Post subject:
Reply with quote

Andrey Mindubaev wrote:
Да ладно Вам придираться то...
Да нет, все не так - я же смайлик специально поставил (т.е. шутя значит). ;)
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Feb 18, 2008 1:15 pm (спустя 15 минут)
   Post subject:
Reply with quote

Похвально, неколько людей, которые на JS собаку съели и 100% каждый из них (и я тоже) когда-то делали "свое правильное" наследование пишут что ничего путного из этого не выйдет, а Андрей упирается. Может что-то и получится, хотя я не верю.

Кстати по поводу классов в след спецификации, опять же задавались вопросом "почему?". Так вот, насколько я помню разработчики интерпритаров пмсали что prototype based примерно в 3 раза больше требует рерурсов. И когда они на C++ или на каком там языке написан интерпритатор, сделают итерпритатор class based js, то с радостью буду этим пользоваться.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML